package com.mlh.myspring.dynamicproxy;

public class MyProxyTest {
    public static void main(String[] args) {
        //这里可以切换 Vehicle 的 实现类
        Vehicle car=new Car();
        VehicleProxyProvider provider=new VehicleProxyProvider(car);
        Vehicle vehicle_proxy= provider.getProxy();
        System.out.println("proxy 编译类型是 Vehicle");
        System.out.println("proxy 运行类型" + vehicle_proxy.getClass());
        //1. proxy 运行类型是 com.sun.proxy.$Proxy0 该类型被转型成 Vehicle
        // 因此可以调用 Vehicle 的接口方法
        //2. 当执行 run() 的时候会调用,
        // 根据 Java 的动态绑定机制, 这时直接调用 Car的 run(),而是 proxy 对象的 invocationHandler 的 invoke 方法(!!!!!!)
        //在invoke 方法中又会去调用被代理对象的run方法
        //3. invoke 方法使用反射机制来调用 run()方法注意这个 run 方法也可以是Vehicle接口中的其它方法
        // 这时就可以在调用 run()方法前，进行前置处理和后置处理
        //4. 也就是说 proxy 的 target_vehicle 运行类型只要是实现了 Vehicle 接口就可以去调用不同的方法, 是动态的，变化的，底层就是 使用反射完成的
        vehicle_proxy.run();
    }
}
